package com.huang.app.antstore.common.pay.alipay;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;

import com.alipay.sdk.app.PayTask;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Random;

/**
 * 必须8个必传参数,前7个不可为空 1:商户id;2收款账号;3商户私钥,packs8格式;4:支付商品的名称.标题;
 * 5:商品详情,支付说明;6:支付的总金额;7:服务器异步通知页面路径;8:支付宝处理完请求后，当前页面跳转到商户指定页面的路径，可空
 * Created by Administrator on 2015/12/4.
 */
public class AlipayAsycnTask extends AsyncTask<String, Void, Void> {
    public static final int SDK_PAY_FLAG = 1;
    public static final int SDK_PAY_ERROR = 2;

    Activity activity;
    Handler payHandler;
    // 商户PID
    String PARTNER;
    // 商户收款账号
    String SELLER;
    // 商户私钥，pkcs8格式
    String RSA_PRIVATE;
    String PAY_SUBJECT;
    String OUT_TRADE_NO;
    String PAY_BODY;
    String PAY_PRICE;
    String NOTIFY_URL;//服务器异步通知页面路径
    String RETURN_URL;//支付宝处理完请求后，当前页面跳转到商户指定页面的路径，可空


    public AlipayAsycnTask(Activity activity, Handler payHandler, String PARTNER, String SELLER, String RSA_PRIVATE, String OUT_TRADE_NO, String PAY_SUBJECT, String PAY_BODY, String PAY_PRICE, String NOTIFY_URL, String RETURN_URL) {
        this.activity = activity;
        this.payHandler = payHandler;
        this.PARTNER = PARTNER;
        this.SELLER = SELLER;
        this.RSA_PRIVATE = RSA_PRIVATE;
        this.PAY_SUBJECT = PAY_SUBJECT;
        this.OUT_TRADE_NO = OUT_TRADE_NO;
        this.PAY_BODY = PAY_BODY;
        this.PAY_PRICE = PAY_PRICE;
        this.NOTIFY_URL = NOTIFY_URL;
        this.RETURN_URL = RETURN_URL;
    }

    @Override
    protected Void doInBackground(String... params) {
        try {

            //        // 商户PID
            //        final String PARTNER = params[0];
            //        // 商户收款账号
            //        final String SELLER = params[1];
            //        // 商户私钥，pkcs8格式
            //        final String RSA_PRIVATE = params[2];
            //        final String PAY_SUBJECT = params[3];
            //        final String PAY_BODY = params[4];
            //        final String PAY_PRICE = params[5];
            //        final String NOTIFY_URL = params[6];//服务器异步通知页面路径
            //        final String RETURN_URL = params[7];//支付宝处理完请求后，当前页面跳转到商户指定页面的路径，可空
            String orderInfo = getOrderInfo(PARTNER, SELLER, OUT_TRADE_NO, PAY_SUBJECT, PAY_BODY, PAY_PRICE, NOTIFY_URL, RETURN_URL);
            // 对订单做RSA 签名
            String sign = sign(orderInfo, RSA_PRIVATE);

            // 仅需对sign 做URL编码
            sign = URLEncoder.encode(sign, "UTF-8");

            // 完整的符合支付宝参数规范的订单信息
            final String payInfo = orderInfo + "&sign=\"" + sign + "\"&"
                    + getSignType();
            // 构造PayTask 对象
            PayTask alipay = new PayTask(activity);
            // 调用支付接口，获取支付结果
            String result = alipay.pay(payInfo, true);
            Message msg = new Message();
            msg.what = SDK_PAY_FLAG;
            msg.obj = result;
            payHandler.sendMessage(msg);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            payHandler.sendEmptyMessage(SDK_PAY_ERROR);
        } catch (Exception ex) {
            ex.printStackTrace();
            payHandler.sendEmptyMessage(SDK_PAY_ERROR);
        }
        return null;
    }

    /**
     * create the order info. 创建订单信息
     */
    public String getOrderInfo(String PARTNER, String SELLER, String OUT_TRADE_NO, String subject, String body, String price, String notify_url, String return_url) {

        // 签约合作者身份ID
        String orderInfo = "partner=" + "\"" + PARTNER + "\"";

        // 签约卖家支付宝账号
        orderInfo += "&seller_id=" + "\"" + SELLER + "\"";

        // 商户网站唯一订单号
        orderInfo += "&out_trade_no=" + "\"" + OUT_TRADE_NO + "\"";

        // 商品名称
        orderInfo += "&subject=" + "\"" + subject + "\"";

        // 商品详情
        orderInfo += "&body=" + "\"" + body + "\"";

        // 商品金额
        orderInfo += "&total_fee=" + "\"" + price + "\"";

        // 服务器异步通知页面路径
        orderInfo += "&notify_url=" + "\"" + notify_url + "\"";

        // 服务接口名称， 固定值
        orderInfo += "&service=\"mobile.securitypay.pay\"";

        // 支付类型， 固定值
        orderInfo += "&payment_type=\"1\"";

        // 参数编码， 固定值
        orderInfo += "&_input_charset=\"utf-8\"";

        // 设置未付款交易的超时时间
        // 默认30分钟，一旦超时，该笔交易就会自动被关闭。
        // 取值范围：1m～15d。
        // m-分钟，h-小时，d-天，1c-当天（无论交易何时创建，都在0点关闭）。
        // 该参数数值不接受小数点，如1.5h，可转换为90m。
        orderInfo += "&it_b_pay=\"30m\"";

        // extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
        // orderInfo += "&extern_token=" + "\"" + extern_token + "\"";

        // 支付宝处理完请求后，当前页面跳转到商户指定页面的路径，可空
        orderInfo += "&return_url=\"null\"";


        return orderInfo;
    }

    /**
     * get the out_trade_no for an order. 生成商户订单号，该值在商户端应保持唯一（可自定义格式规范）
     */
    public String getOutTradeNo() {
        SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss",
                Locale.getDefault());
        Date date = new Date();
        String key = format.format(date);

        Random r = new Random();
        key = key + r.nextInt();
        key = key.substring(0, 15);
        return key;
    }

    /**
     * sign the order info. 对订单信息进行签名
     *
     * @param content 待签名订单信息
     */
    public String sign(String content, String RSA_PRIVATE) {
        return SignUtils.sign(content, RSA_PRIVATE);
    }

    /**
     * get the sign type we use. 获取签名方式
     */
    public String getSignType() {
        return "sign_type=\"RSA\"";
    }
}
